'''
三数之和：
先排序，然后使用左右指针，需要注意去重。
根据三数之和判断给出的值大小，然后进行左右指针移动。最后把数字添加进去。
更新下一次计算的数字时，需要把左边和右边的重复数据去除掉。

https://cloud.tencent.com/developer/article/2262666
'''

def threeSum(nums):
    nums.sort() # 升序排序
    result = []
    n = len(nums)
    
    for i in range(n - 2):
        if i > 0 and nums[i] == nums[i - 1]: # 三元组去重
            continue
        print(i)
        left, right = i + 1, n - 1
        print("left=", left, "right=", right)
        while left < right:
            print("i=", i, "left=", left, "right=", right)
            total = nums[i] + nums[left] + nums[right]
            if total < 0: # 太小了，左边右移
                left += 1
            elif total > 0: # 太大了，右边左移
                right -= 1
            else:            
                print("push i=", i, "left=", left, "right=", right)
                print("nums=", nums)
                print("push num i=", nums[i], "left=", nums[left], "right=", nums[right])
                result.append([nums[i], nums[left], nums[right]]) # 记录三元组
                while left < right and nums[left] == nums[left + 1]: # 左边去重
                    left += 1
                while left < right and nums[right] == nums[right - 1]: # 右边去重
                    right -= 1
                
                # 更新位置
                left += 1
                right -= 1
    return result
num = [-1,0,1,2,-1,-4]
print(threeSum(num))